package com.idanchuang.support.etcache;

import com.idanchuang.support.etcache.local.LocalKey;
import com.idanchuang.support.etcache.remote.codec.ValueCodec;

import java.util.Map;
import java.util.concurrent.TimeUnit;

/**
 * 核心缓存接口
 * @author yjy
 * Created at 2021/12/14 4:36 下午
 */
public interface Cache<K, V> {

    /**
     * 读取缓存
     * @param key ..
     * @return ..
     */
    V get(K key);

    /**
     * 批量读取缓存
     * @param keys ..
     * @return ..
     */
    Map<K, V> getAll(Iterable<K> keys);

    /**
     * 设置缓存
     * @param key ..
     * @param value ..
     */
    void set(K key, V value);

    /**
     * 设置缓存, 并设置过期时间
     * @param key ..
     * @param value ..
     * @param expire 过期时间
     * @param timeUnit 时间单位
     */
    void set(K key, V value, long expire, TimeUnit timeUnit);

    /**
     * 批量设置缓存
     * @param map 键值对集合
     */
    void setAll(Map<K, V> map);

    /**
     * 批量设置缓存, 并设置过期时间
     * @param map 键值对集合
     * @param expire 过期时间
     * @param timeUnit 时间单位
     */
    void setAll(Map<K, V> map, long expire, TimeUnit timeUnit);

    /**
     * 移除一个缓存
     * @param key ..
     */
    void remove(K key);

    /**
     * 批量移除缓存
     * @param keys ..
     */
    void removeAll(Iterable<K> keys);

    /**
     * 移除一个缓存
     * @param localKey ..
     */
    void refreshLocal(LocalKey<K> localKey);

    /**
     * 当前本地缓存集合的大小，返回当前本地缓存集合中的缓存个数
     *
     * 注意：这只是一个估计值
     *
     * @return ..
     */
    int estimatedLocalSize();

    /**
     * key编解码器
     * @return ..
     */
    ValueCodec getKeyCodec();

    /**
     * value编解码器
     * @return ..
     */
    ValueCodec getValueCodec();

    /**
     * 销毁缓存对象
     */
    void destroy();

}
